package com.bird.postProcessor;

import com.bird.body.Student;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @data 2023/2/19 16:55
 * @author: bird
 * @description: 自定义一个 BeanDefinition注册之后的后置处理器
 * 1：验证BeanDefinitionRegistryPostProcessor的使用：
 * <p>
 * 2：结论：
 */
@Configuration
public class CustomizedBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    /**
    * 验证内容：
    * 1：修改已经注册到容器里面的BeanDefinition实例的属性的值。
    * 2：在常规的BeanDefinition实例注册到容器完成之后，再将需要注册的类注册到容器中。
    * 结论：
     * 1：正确
     * 2：正确
    * */

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
         // 从容器里面删除这个BeanDefinition实例
        BeanDefinition teacher = registry.getBeanDefinition("teacher");
        teacher.setScope("prototype");

        // 1:先获取需要注册到容器里面的Class
        Class<Student> studentClass = Student.class;
        //2:包装需要注册的Class,通过BeanDefinitionBuilder
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(studentClass);
        GenericBeanDefinition beanDefinition = (GenericBeanDefinition)beanDefinitionBuilder.getRawBeanDefinition();
        //3:将class注册到容器中。并设置bean的名字
        registry.registerBeanDefinition("student-22",beanDefinition);
        System.out.println("在常规的BeanDefinition实例注册到容器之后执行的方法。将Student注册到容器");
    }


    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}
